package com.cskaoyan.javase.io._1byte._4buffer;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 自带缓冲byte数组区的缓冲字节流
 * 它也是可以分为两大类:
 *      1.缓冲字节输出流
 *      2.缓冲字节输入流
 * 缓冲字节流是典型的包装流,
 * 包装流本身不能实现流的功能,只是包装了一些基础流然后扩展它们的功能
 * 成为了一个新的流
 *
 * 缓冲字节流底层依赖于普通字节流实现IO功能,缓冲字节流扩展了缓冲区的功能提高了普通字节流IO操作的效率
 *
 * 带缓冲区的字节输出流,缓冲字节输出流,数据的转移是:
 * 内存-->缓冲区 --> 外存
 * 在这个过程中,必须进行缓冲区的刷新flush,缓冲区的数据才能够写入到外存
 * 如果不刷新,数据就只会在缓冲区当中,不会写到外存中
 *
 * 只有带缓冲区的输出流对象才需要刷新缓冲区,输入流不需要!!!
 * 怎么刷新缓冲区:
 *      1.close关闭缓冲流时,会自动刷新缓冲区
 *      2.调用flush方法,手动/强制刷新缓冲区
 *      3.如果缓冲区装满了也会自动刷新(满了就行,不需要超过)
 *          (该方式仅供了解,实际开发中不要这么用)
 * 使用字节缓冲区输出流对象时:
 *      1.创建对象
 *      2.write
 *      3.手动flush
 *      4.close
 *
 * 一个小的细节:
 * 所有的包装流对象在close方法执行时,都会先关闭底层流,所以不需要重复关闭被包装的流
 *
 * @since 17:18
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        // BufferedOutputStream(OutputStream out)	创建一个新的缓冲输出流
        // 以将数据写入指定的底层输出流。默认缓冲区大小是8KB
        // 1.创建了缓冲字节输出流对象,它是一个包装流,它的IO功能实现依赖于被包装的文件字节输出流对象
        BufferedOutputStream bufferOut = new BufferedOutputStream(new FileOutputStream("a.txt"), 5);
        // write(int b)	void	将指定的字节写入此输出流，此时要写入的字节是参数 b 的八个低位，而24 个高位将被忽略。
        // write(byte[] b)	void	将 b.length 个字节从指定的 byte 数组写入此输出流。
        // write(byte[] b,  int off, int len)	void	将指定 byte 数组中从偏移量 off 开始的  len 个字节写入此输出流。

        bufferOut.write("123456".getBytes());

        // bufferOut.flush();

        // close关闭
        // bufferOut.close();

    }
}
